#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *输入一个整型数组，数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

 

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。
 

提示：

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */

//输入数组怎么输出

// [-2,1,-3,4,-1,2,1,-5,4]
// 4,-1,2,1
int maxSubArray1(vector<int> &nums) {
    vector<int> dp(nums.size());//存储最大值  INT_MIN]
    dp[0] = nums[0];
    int maxV = nums[0];
    int right = 0;
    //只有他和大于0就ok
    for (int i = 1; i < nums.size(); i++) {
        dp[i] = max(dp[i - 1] + nums[i], nums[i]);

        if (dp[i] > maxV) {
            maxV = dp[i];
            right = i;
        }

    }

    //之后right一直减 到0就能找到left下标 这个方法就是骚哈哈哈


    return maxV;
}